This is an R Markdown Notebook. When you execute code within the notebook, the results appear beneath the code.

Try executing this chunk by clicking the Run button within the chunk or by placing your cursor inside it and pressing Cmd+Shift+Enter.

library('rgdal')
library('dismo')
library('raster')
library('sp')
library('maptools')
library('readr')
library('ggplot2')
library('ggmap')
library('sf')
#saving file into a label and reading
occ.data <- read.csv(file = "data/bombus_emu.csv")

summary(occ.data)
            Barcode     
 USNMENT00123087:    1  
 USNMENT00679000:    1  
 USNMENT00679001:    1  
 USNMENT00679002:    1  
 USNMENT00679003:    1  
 USNMENT00679004:    1  
 (Other)        :44108  
                                                                                        Taxon      
 Bombus unidentified : Apidae : Hymenoptera : Insecta : Arthropoda                         :10752  
 Bombus bifarius nearcticus : Apidae : Hymenoptera : Insecta : Arthropoda                  : 2533  
 Bombus (Pyrobombus) mixtus Cresson, 1878 : Apidae : Hymenoptera : Insecta : Arthropoda    : 2122  
 Bombus (Bombus) affinis Cresson : Apidae : Hymenoptera : Insecta : Arthropoda             : 1902  
 Bombus (Pyrobombus) flavifrons Cresson, 1863 : Apidae : Hymenoptera : Insecta : Arthropoda: 1701  
 Bombus (Pyrobombus) bifarius Cresson, 1878 : Apidae : Hymenoptera : Insecta : Arthropoda  : 1553  
 (Other)                                                                                   :23551  
 DarDecimalLatitude DarDecimalLongitude
 Min.   :-53.63     Min.   :-172.72    
 1st Qu.: 39.52     1st Qu.:-122.42    
 Median : 42.08     Median :-105.27    
 Mean   : 43.63     Mean   : -94.24    
 3rd Qu.: 48.09     3rd Qu.: -84.19    
 Max.   : 86.33     Max.   : 175.38    
 NA's   :18110      NA's   :18110      
                      DarScientificName DarScientificNameAuthor
 Bombus unidentified           :10752             :13285       
 Bombus bifarius nearcticus    : 2533   Cresson   :11766       
 Bombus (Pyrobombus) mixtus    : 2122   Smith     : 3193       
 Bombus (Bombus) affinis       : 1902   Nylander  : 2079       
 Bombus (Pyrobombus) flavifrons: 1701   (Linnaeus): 1868       
 Bombus (Pyrobombus) bifarius  : 1553   Greene    : 1781       
 (Other)                       :23551   (Other)   :10142       
 DarScientificNameAuthorYear    DarSpecificEpithet
              :13285         unidentified:10752   
 Cresson, 1878: 4436         bifarius    : 4086   
 Cresson, 1863: 4097         mixtus      : 2122   
 Smith        : 3080         affinis     : 1902   
 Cresson      : 2861         flavifrons  : 1701   
 Nylander     : 2079         melanopygus : 1423   
 (Other)      :14276         (Other)     :22128   
 DarYearCollected       DarCollector  
 Min.   : 947     L. Macior   :15123  
 1st Qu.:1932     [Not Stated]: 4316  
 Median :1965     D. Graham   : 4200  
 Mean   :1953     J. Bridwell : 2096  
 3rd Qu.:1971     E. Stiles   : 1582  
 Max.   :2017     J. Clarke   : 1523  
 NA's   :4567     (Other)     :15274  
                                      AdmGUIDPreferredValue
 ark:/65665/300030cb7-f6da-4dc3-8005-b769a0386842:    1    
 ark:/65665/30003be57-6cf7-4e31-b1e6-df2a59f21999:    1    
 ark:/65665/3000427d0-37c4-4d9e-8e40-494c334429df:    1    
 ark:/65665/30004595f-cd68-4adb-9cb1-50905d58f9e0:    1    
 ark:/65665/30004b971-c32d-44a6-b1e1-c774d8f0da37:    1    
 ark:/65665/3000513bb-73ae-48ed-bfe3-f47fa9a4cf02:    1    
 (Other)                                         :44108    
        DarStateProvince        DarCounty    
 Colorado       : 5326   [Not Stated]:15382  
 Yukon Territory: 3953   Boulder     : 3525  
 Washington     : 3496   Tuolumne    : 2025  
 Sichuan        : 3428   Racine      : 1169  
 California     : 3378   Warren      : 1139  
 [Not Stated]   : 2834   Surrey      :  811  
 (Other)        :21699   (Other)     :20063  
       DarLocality    DarMonthCollected DarDayCollected
 [Not Stated]:14646   Min.   : 1.000    Min.   : 1.0   
 Kluane      : 3771   1st Qu.: 6.000    1st Qu.: 8.0   
 Esher       : 1080   Median : 7.000    Median :15.0   
 Clearview   :  472   Mean   : 6.898    Mean   :15.5   
 Corvallis   :  434   3rd Qu.: 8.000    3rd Qu.:23.0   
 Mount Emei  :  415   Max.   :12.000    Max.   :31.0   
 (Other)     :23296   NA's   :4910      NA's   :7562   
 DarFieldNumber DarCollectorNumber DarPreparations
 Mode:logical   Mode:logical       Pinned:44114   
 NA's:44114     NA's:44114                        
                                                  
                                                  
                                                  
                                                  
                                                  
dir.create(path = 'data')
'data' already exists
dir.create(path = 'output')
'output' already exists
#shows properties of data, rows and columns
dim(occ.data)
[1] 44114    19
#Column names
colnames(occ.data)
 [1] "Barcode"                     "Taxon"                      
 [3] "DarDecimalLatitude"          "DarDecimalLongitude"        
 [5] "DarScientificName"           "DarScientificNameAuthor"    
 [7] "DarScientificNameAuthorYear" "DarSpecificEpithet"         
 [9] "DarYearCollected"            "DarCollector"               
[11] "AdmGUIDPreferredValue"       "DarStateProvince"           
[13] "DarCounty"                   "DarLocality"                
[15] "DarMonthCollected"           "DarDayCollected"            
[17] "DarFieldNumber"              "DarCollectorNumber"         
[19] "DarPreparations"            
#bioclimatic data
bioclim.data<- getData(name = 'worldclim',
                       var = 'bio',
                       res = 2.5,
                       path = "data/")
#disregarding all nulled values for lon and lat
clean.data <- subset(occ.data, !is.na(DarDecimalLatitude) & !is.na(DarDecimalLongitude))
#shows properties of data

dim(clean.data)
[1] 26004    19
clean.data
NA
#Determining what the max and min geographical values of map are
max.lat <- (max(clean.data$DarDecimalLatitude))
min.lat <- (min(clean.data$DarDecimalLatitude))
max.lon <- (max(clean.data$DarDecimalLongitude))
min.lon <- (min(clean.data$DarDecimalLongitude))
#Display Values
max.lat
[1] 86.3264
min.lon
[1] -172.72
max.lon
[1] 175.38
min.lat
[1] -53.63
#Establishing extent of map (will be able to plot only north american in later model)
geo.extent <- extent(x = c(min.lon, max.lon, min.lat, max.lat))
c(min.lon, max.lon, min.lat, max.lat)
#Using only collumns from lon and lat
loc.data <- clean.data [, c('DarDecimalLongitude', 'DarDecimalLatitude')]
loc.data
NA
data("wrld_simpl")

plot(wrld_simpl,
     xlim = c(min.lon, max.lon),
     ylim = c(min.lat, max.lat ), 
     axes = TRUE,
     col = 'grey95')

#adding points on to map
points(x = loc.data$DarDecimalLongitude,
       y = loc.data$DarDecimalLatitude,
       col = 'olivedrab',
       pch = 20,
       cex = 0.75)


#box around map
box()

bc.model <- bioclim(x = bioclim.data, p = loc.data)

predict.presence <- dismo::predict(object = bc.model, x = bioclim.data, ext = geo.extent)
#plot base map
plot(wrld_simpl,
     xlim = c(min.lon, max.lon),
     ylim = c(min.lat, max.lat),
     axes = TRUE,
     col = "grey95")

#adding model probabilities
plot(predict.presence, add = TRUE)
 
#redrawing country borders
plot(wrld_simpl, add = TRUE, border = "grey6")

#adding OG observations
points(x = loc.data$DarDecimalLongitude,
       y = loc.data$DarDecimalLatitude,
       col = 'olivedrab',
       pch = 20,
       cex = 0.75)

NA
NA
sep.data <- clean.data [, c('Taxon', 'DarDecimalLongitude', 'DarDecimalLatitude')]
pyro.data <- read.csv(file = 'data/Pyrobombus_emu.csv')

locpyro.data <- pyro.data [, c('DarDecimalLongitude', 'DarDecimalLatitude')]

locpyro.data
plot(wrld_simpl,
     xlim = c(min.lon, max.lon),
     ylim = c(min.lat, max.lat),
     axes = TRUE,
     col = "grey95")

plot(wrld_simpl, add = TRUE, border = "grey5")

points(x = clean.data$DarDecimalLongitude,
       y = clean.data$DarDecimalLatitude,
       col = 'olivedrab',
       pch = 20,
       cex = 0.75)

points(x = locpyro.data$DarDecimalLongitude,
       y = locpyro.data$DarDecimalLatitude,
       col = 'red',
       pch = 20,
       cex = 0.75)
Agro.data <- read.csv(file = 'data/Agro_emu.csv')
Alpigeno.data <- read.csv(file = 'data/Alpigeno_emu.csv')
Alpino.data <- read.csv(file = 'data/Alpino_emu.csv')
Bombias.data <- read.csv(file = 'data/Bombias_emu.csv')
BombusSub.data <- read.csv(file = 'data/BombusSub_emu.csv')
Brachy.data <- read.csv (file = 'data/Brachycephalobombus_emu.csv')
Coccineo.data <- read.csv(file = 'data/Coccineo_emu.csv')
Confusii.data <- read.csv(file = 'data/Confusii_emu.csv')
Crotchii.data <- read.csv(file = 'data/Crotchii_emu.csv')
Collumano.data <- read.csv(file = 'data/Collumano_emu.csv')
Diverso.data <- read.csv(file = 'data/Diverso_emu.csv')
Dasy.data <- read.csv(file = 'data/Dasy_emu.csv')
Fervido.data <- read.csv(file = 'data/Fervido_emu.csv')
Thoraco.data <- read.csv(file = 'data/Thoraco_emu.csv')
#Disregarding all na values in each data frame
Alpigeno.data <- subset(Alpigeno.data, !is.na(DarLatitude) & !is.na(DarLongitude))
locAlpigen.data <- Alpigeno.data [, c('DarLongitude', 'DarLatitude')]
locAlpigen.data

Agro.data <- subset(Agro.data, !is.na(DarLatitude) & !is.na(DarLongitude))
locAgro.data <- Agro.data [, c('DarLongitude', 'DarLatitude')]

Alpino.data <- subset(Alpino.data, !is.na(DarLatitude) & !is.na(DarLongitude))
locAlpino.data <- Alpino.data [, c('DarLongitude', 'DarLatitude')]

Bombias.data <- subset(Bombias.data, !is.na(DarLatitude) & !is.na(DarLongitude))
locBombias.data <- Bombias.data [, c('DarLongitude', 'DarLatitude')]


BombusSub.data <- subset(BombusSub.data, !is.na(DarLatitude) & !is.na(DarLongitude))
locBombus.data <- BombusSub.data [, c('DarLongitude', 'DarLatitude')]


Brachy.data <- subset(Brachy.data, !is.na(DarLatitude) & !is.na(DarLongitude))
locBrachy.data <- Brachy.data [, c('DarLongitude', 'DarLatitude')]

#skipped Coccineo

Collum.data <- subset(Collumano.data, !is.na(DarLatitude) & !is.na(DarLongitude))
locCollum.data <- Collum.data [, c('DarLongitude', 'DarLatitude')]

Thoraco.data <- subset(Thoraco.data, !is.na(DarLatitude) & !is.na(DarLongitude))
locThoraco.data <- Thoraco.data [, c('DarLongitude', 'DarLatitude')]
plot(wrld_simpl,
     xlim = c(min.lon, max.lon),
     ylim = c(min.lat, max.lat),
     axes = TRUE,
     col = "grey95")

plot(wrld_simpl, add = TRUE, border = "grey5")

#points(x = clean.data$DarDecimalLongitude,
 #      y = clean.data$DarDecimalLatitude,
  #     col = 'olivedrab',
   #    pch = 20,
    #   cex = 0.75)

points(x = locpyro.data$DarDecimalLongitude,
       y = locpyro.data$DarDecimalLatitude,
       col = 'red',
       pch = 20,
       cex = 0.75)

points(x = locAlpigen.data$DarLongitude,
       y = locAlpigen.data$DarLatitude,
       col = 'yellow',
       pch = 20,
       cex = 0.75)

points(x = locAgro.data$DarLongitude,
       y = locAgro.data$DarLatitude,
       col = 'pink',
       pch = 20,
       cex = 0.75)
 
points(x = locAlpino.data$DarLongitude,
       y = locAlpino.data$DarLatitude,
       col = 'blue',
       pch = 20,
       cex = 0.75)


points(x = locBombias.data$DarLongitude,
       y = locBombias.data$DarLatitude,
       col = 'purple',
       pch = 20,
       cex = 0.75)

points(x = locBombus.data$DarLongitude,
       y = locBombus.data$DarLatitude,
       col = 'grey',
       pch = 20,
       cex = 0.75)

points(x = locBrachy.data$DarLongitude,
       y = locBrachy.data$DarLatitude,
       col = 'olivedrab',
       pch = 20,
       cex = 0.75)

points(x = locCollum.data$DarLongitude,
       y = locCollum.data$DarLatitude,
       col = 'black',
       pch = 20,
       cex = 0.75)

points(x = locThoraco.data$DarLongitude,
       y = locThoraco.data$DarLatitude,
       col = 'green',
       pch = 20,
       cex = 0.75)

plot(wrld_simpl,
     xlim = c(-170, -39),
     ylim = c(11, 72),
     axes = TRUE,
     col = "grey95")
points(x = locpyro.data$DarDecimalLongitude,
       y = locpyro.data$DarDecimalLatitude,
       col = 'red',
       pch = 20,
       cex = 0.75)

points(x = locBombus.data$DarLongitude,
       y = locBombus.data$DarLatitude,
       col = 'grey',
       pch = 20,
       cex = 0.75)
points(x = locCollum.data$DarLongitude,
       y = locCollum.data$DarLatitude,
       col = 'black',
       pch = 20,
       cex = 0.75)

points(x = locThoraco.data$DarLongitude,
       y = locThoraco.data$DarLatitude,
       col = 'green',
       pch = 20,
       cex = 0.75) 

Add a new chunk by clicking the Insert Chunk button on the toolbar or by pressing Cmd+Option+I.

When you save the notebook, an HTML file containing the code and output will be saved alongside it (click the Preview button or press Cmd+Shift+K to preview the HTML file).

The preview shows you a rendered HTML copy of the contents of the editor. Consequently, unlike Knit, Preview does not run any R code chunks. Instead, the output of the chunk when it was last run in the editor is displayed.

LS0tCnRpdGxlOiAiRGlzdHJpYnV0aW9uIE1hcDogQm9tYnVzIGFuZCBpdHMgU3ViZ2VuZXJhIgpvdXRwdXQ6CiAgd29yZF9kb2N1bWVudDogZGVmYXVsdAogIHBkZl9kb2N1bWVudDogZGVmYXVsdAogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQKLS0tCgpUaGlzIGlzIGFuIFtSIE1hcmtkb3duXShodHRwOi8vcm1hcmtkb3duLnJzdHVkaW8uY29tKSBOb3RlYm9vay4gV2hlbiB5b3UgZXhlY3V0ZSBjb2RlIHdpdGhpbiB0aGUgbm90ZWJvb2ssIHRoZSByZXN1bHRzIGFwcGVhciBiZW5lYXRoIHRoZSBjb2RlLiAKClRyeSBleGVjdXRpbmcgdGhpcyBjaHVuayBieSBjbGlja2luZyB0aGUgKlJ1biogYnV0dG9uIHdpdGhpbiB0aGUgY2h1bmsgb3IgYnkgcGxhY2luZyB5b3VyIGN1cnNvciBpbnNpZGUgaXQgYW5kIHByZXNzaW5nICpDbWQrU2hpZnQrRW50ZXIqLiAKCgpgYGB7cn0KbGlicmFyeSgncmdkYWwnKQpsaWJyYXJ5KCdkaXNtbycpCmxpYnJhcnkoJ3Jhc3RlcicpCmxpYnJhcnkoJ3NwJykKbGlicmFyeSgnbWFwdG9vbHMnKQpsaWJyYXJ5KCdyZWFkcicpCmxpYnJhcnkoJ2dncGxvdDInKQpsaWJyYXJ5KCdnZ21hcCcpCmxpYnJhcnkoJ3NmJykKCmBgYAoKCmBgYHtyfQojc2F2aW5nIGZpbGUgaW50byBhIGxhYmVsIGFuZCByZWFkaW5nCm9jYy5kYXRhIDwtIHJlYWQuY3N2KGZpbGUgPSAiZGF0YS9ib21idXNfZW11LmNzdiIpCgpzdW1tYXJ5KG9jYy5kYXRhKQpgYGAKCmBgYHtyfQpkaXIuY3JlYXRlKHBhdGggPSAnZGF0YScpCmRpci5jcmVhdGUocGF0aCA9ICdvdXRwdXQnKQoKYGBgCgoKYGBge3J9CiNzaG93cyBwcm9wZXJ0aWVzIG9mIGRhdGEsIHJvd3MgYW5kIGNvbHVtbnMKZGltKG9jYy5kYXRhKQojQ29sdW1uIG5hbWVzCmNvbG5hbWVzKG9jYy5kYXRhKQoKI2Jpb2NsaW1hdGljIGRhdGEKYmlvY2xpbS5kYXRhPC0gZ2V0RGF0YShuYW1lID0gJ3dvcmxkY2xpbScsCiAgICAgICAgICAgICAgICAgICAgICAgdmFyID0gJ2JpbycsCiAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gMi41LAogICAgICAgICAgICAgICAgICAgICAgIHBhdGggPSAiZGF0YS8iKQpgYGAKCgpgYGB7cn0KI2Rpc3JlZ2FyZGluZyBhbGwgbnVsbGVkIHZhbHVlcyBmb3IgbG9uIGFuZCBsYXQKY2xlYW4uZGF0YSA8LSBzdWJzZXQob2NjLmRhdGEsICFpcy5uYShEYXJEZWNpbWFsTGF0aXR1ZGUpICYgIWlzLm5hKERhckRlY2ltYWxMb25naXR1ZGUpKQoKCmBgYApgYGB7cn0KCmRpbShjbGVhbi5kYXRhKQpjbGVhbi5kYXRhCgpgYGAKCgoKCgoKYGBge3J9CiNEZXRlcm1pbmluZyB3aGF0IHRoZSBtYXggYW5kIG1pbiBnZW9ncmFwaGljYWwgdmFsdWVzIG9mIG1hcCBhcmUKbWF4LmxhdCA8LSAobWF4KGNsZWFuLmRhdGEkRGFyRGVjaW1hbExhdGl0dWRlKSkKbWluLmxhdCA8LSAobWluKGNsZWFuLmRhdGEkRGFyRGVjaW1hbExhdGl0dWRlKSkKbWF4LmxvbiA8LSAobWF4KGNsZWFuLmRhdGEkRGFyRGVjaW1hbExvbmdpdHVkZSkpCm1pbi5sb24gPC0gKG1pbihjbGVhbi5kYXRhJERhckRlY2ltYWxMb25naXR1ZGUpKQpgYGAKYGBge3J9CiNEaXNwbGF5IFZhbHVlcwptYXgubGF0Cm1pbi5sb24KbWF4LmxvbgptaW4ubGF0CgoKCmBgYApgYGB7cn0KI0VzdGFibGlzaGluZyBleHRlbnQgb2YgbWFwICh3aWxsIGJlIGFibGUgdG8gcGxvdCBvbmx5IG5vcnRoIGFtZXJpY2FuIGluIGxhdGVyIG1vZGVsKQpnZW8uZXh0ZW50IDwtIGV4dGVudCh4ID0gYyhtaW4ubG9uLCBtYXgubG9uLCBtaW4ubGF0LCBtYXgubGF0KSkKYyhtaW4ubG9uLCBtYXgubG9uLCBtaW4ubGF0LCBtYXgubGF0KQpgYGAKCgpgYGB7cn0KI1VzaW5nIG9ubHkgY29sbHVtbnMgZnJvbSBsb24gYW5kIGxhdApsb2MuZGF0YSA8LSBjbGVhbi5kYXRhIFssIGMoJ0RhckRlY2ltYWxMb25naXR1ZGUnLCAnRGFyRGVjaW1hbExhdGl0dWRlJyldCmxvYy5kYXRhCgpgYGAKCmBgYHtyfQpkYXRhKCJ3cmxkX3NpbXBsIikKCnBsb3Qod3JsZF9zaW1wbCwKICAgICB4bGltID0gYyhtaW4ubG9uLCBtYXgubG9uKSwKICAgICB5bGltID0gYyhtaW4ubGF0LCBtYXgubGF0ICksIAogICAgIGF4ZXMgPSBUUlVFLAogICAgIGNvbCA9ICdncmV5OTUnKQoKI2FkZGluZyBwb2ludHMgb24gdG8gbWFwCnBvaW50cyh4ID0gbG9jLmRhdGEkRGFyRGVjaW1hbExvbmdpdHVkZSwKICAgICAgIHkgPSBsb2MuZGF0YSREYXJEZWNpbWFsTGF0aXR1ZGUsCiAgICAgICBjb2wgPSAnb2xpdmVkcmFiJywKICAgICAgIHBjaCA9IDIwLAogICAgICAgY2V4ID0gMC43NSkKCgojYm94IGFyb3VuZCBtYXAKYm94KCkKYGBgCgoKYGBge3J9CmJjLm1vZGVsIDwtIGJpb2NsaW0oeCA9IGJpb2NsaW0uZGF0YSwgcCA9IGxvYy5kYXRhKQoKcHJlZGljdC5wcmVzZW5jZSA8LSBkaXNtbzo6cHJlZGljdChvYmplY3QgPSBiYy5tb2RlbCwgeCA9IGJpb2NsaW0uZGF0YSwgZXh0ID0gZ2VvLmV4dGVudCkKYGBgCmBgYHtyfQojcGxvdCBiYXNlIG1hcApwbG90KHdybGRfc2ltcGwsCiAgICAgeGxpbSA9IGMobWluLmxvbiwgbWF4LmxvbiksCiAgICAgeWxpbSA9IGMobWluLmxhdCwgbWF4LmxhdCksCiAgICAgYXhlcyA9IFRSVUUsCiAgICAgY29sID0gImdyZXk5NSIpCgojYWRkaW5nIG1vZGVsIHByb2JhYmlsaXRpZXMKcGxvdChwcmVkaWN0LnByZXNlbmNlLCBhZGQgPSBUUlVFKQogCiNyZWRyYXdpbmcgY291bnRyeSBib3JkZXJzCnBsb3Qod3JsZF9zaW1wbCwgYWRkID0gVFJVRSwgYm9yZGVyID0gImdyZXk2IikKCiNhZGRpbmcgT0cgb2JzZXJ2YXRpb25zCnBvaW50cyh4ID0gbG9jLmRhdGEkRGFyRGVjaW1hbExvbmdpdHVkZSwKICAgICAgIHkgPSBsb2MuZGF0YSREYXJEZWNpbWFsTGF0aXR1ZGUsCiAgICAgICBjb2wgPSAnb2xpdmVkcmFiJywKICAgICAgIHBjaCA9IDIwLAogICAgICAgY2V4ID0gMC43NSkKYGBgCmBgYHtyfQpzZXAuZGF0YSA8LSBjbGVhbi5kYXRhIFssIGMoJ1RheG9uJywgJ0RhckRlY2ltYWxMb25naXR1ZGUnLCAnRGFyRGVjaW1hbExhdGl0dWRlJyldCgpgYGAKYGBge3J9CnB5cm8uZGF0YSA8LSByZWFkLmNzdihmaWxlID0gJ2RhdGEvUHlyb2JvbWJ1c19lbXUuY3N2JykKCmxvY3B5cm8uZGF0YSA8LSBweXJvLmRhdGEgWywgYygnRGFyRGVjaW1hbExvbmdpdHVkZScsICdEYXJEZWNpbWFsTGF0aXR1ZGUnKV0KCmxvY3B5cm8uZGF0YQpgYGAKYGBge3J9CnBsb3Qod3JsZF9zaW1wbCwKICAgICB4bGltID0gYyhtaW4ubG9uLCBtYXgubG9uKSwKICAgICB5bGltID0gYyhtaW4ubGF0LCBtYXgubGF0KSwKICAgICBheGVzID0gVFJVRSwKICAgICBjb2wgPSAiZ3JleTk1IikKCnBsb3Qod3JsZF9zaW1wbCwgYWRkID0gVFJVRSwgYm9yZGVyID0gImdyZXk1IikKCnBvaW50cyh4ID0gY2xlYW4uZGF0YSREYXJEZWNpbWFsTG9uZ2l0dWRlLAogICAgICAgeSA9IGNsZWFuLmRhdGEkRGFyRGVjaW1hbExhdGl0dWRlLAogICAgICAgY29sID0gJ29saXZlZHJhYicsCiAgICAgICBwY2ggPSAyMCwKICAgICAgIGNleCA9IDAuNzUpCgpwb2ludHMoeCA9IGxvY3B5cm8uZGF0YSREYXJEZWNpbWFsTG9uZ2l0dWRlLAogICAgICAgeSA9IGxvY3B5cm8uZGF0YSREYXJEZWNpbWFsTGF0aXR1ZGUsCiAgICAgICBjb2wgPSAncmVkJywKICAgICAgIHBjaCA9IDIwLAogICAgICAgY2V4ID0gMC43NSkKYGBgCmBgYHtyfQpBZ3JvLmRhdGEgPC0gcmVhZC5jc3YoZmlsZSA9ICdkYXRhL0Fncm9fZW11LmNzdicpCkFscGlnZW5vLmRhdGEgPC0gcmVhZC5jc3YoZmlsZSA9ICdkYXRhL0FscGlnZW5vX2VtdS5jc3YnKQpBbHBpbm8uZGF0YSA8LSByZWFkLmNzdihmaWxlID0gJ2RhdGEvQWxwaW5vX2VtdS5jc3YnKQpCb21iaWFzLmRhdGEgPC0gcmVhZC5jc3YoZmlsZSA9ICdkYXRhL0JvbWJpYXNfZW11LmNzdicpCkJvbWJ1c1N1Yi5kYXRhIDwtIHJlYWQuY3N2KGZpbGUgPSAnZGF0YS9Cb21idXNTdWJfZW11LmNzdicpCkJyYWNoeS5kYXRhIDwtIHJlYWQuY3N2IChmaWxlID0gJ2RhdGEvQnJhY2h5Y2VwaGFsb2JvbWJ1c19lbXUuY3N2JykKQ29jY2luZW8uZGF0YSA8LSByZWFkLmNzdihmaWxlID0gJ2RhdGEvQ29jY2luZW9fZW11LmNzdicpCkNvbmZ1c2lpLmRhdGEgPC0gcmVhZC5jc3YoZmlsZSA9ICdkYXRhL0NvbmZ1c2lpX2VtdS5jc3YnKQpDcm90Y2hpaS5kYXRhIDwtIHJlYWQuY3N2KGZpbGUgPSAnZGF0YS9Dcm90Y2hpaV9lbXUuY3N2JykKQ29sbHVtYW5vLmRhdGEgPC0gcmVhZC5jc3YoZmlsZSA9ICdkYXRhL0NvbGx1bWFub19lbXUuY3N2JykKRGl2ZXJzby5kYXRhIDwtIHJlYWQuY3N2KGZpbGUgPSAnZGF0YS9EaXZlcnNvX2VtdS5jc3YnKQpEYXN5LmRhdGEgPC0gcmVhZC5jc3YoZmlsZSA9ICdkYXRhL0Rhc3lfZW11LmNzdicpCkZlcnZpZG8uZGF0YSA8LSByZWFkLmNzdihmaWxlID0gJ2RhdGEvRmVydmlkb19lbXUuY3N2JykKVGhvcmFjby5kYXRhIDwtIHJlYWQuY3N2KGZpbGUgPSAnZGF0YS9UaG9yYWNvX2VtdS5jc3YnKQpgYGAKYGBge3J9CiNEaXNyZWdhcmRpbmcgYWxsIG5hIHZhbHVlcyBpbiBlYWNoIGRhdGEgZnJhbWUKQWxwaWdlbm8uZGF0YSA8LSBzdWJzZXQoQWxwaWdlbm8uZGF0YSwgIWlzLm5hKERhckxhdGl0dWRlKSAmICFpcy5uYShEYXJMb25naXR1ZGUpKQpsb2NBbHBpZ2VuLmRhdGEgPC0gQWxwaWdlbm8uZGF0YSBbLCBjKCdEYXJMb25naXR1ZGUnLCAnRGFyTGF0aXR1ZGUnKV0KbG9jQWxwaWdlbi5kYXRhCgpBZ3JvLmRhdGEgPC0gc3Vic2V0KEFncm8uZGF0YSwgIWlzLm5hKERhckxhdGl0dWRlKSAmICFpcy5uYShEYXJMb25naXR1ZGUpKQpsb2NBZ3JvLmRhdGEgPC0gQWdyby5kYXRhIFssIGMoJ0RhckxvbmdpdHVkZScsICdEYXJMYXRpdHVkZScpXQoKQWxwaW5vLmRhdGEgPC0gc3Vic2V0KEFscGluby5kYXRhLCAhaXMubmEoRGFyTGF0aXR1ZGUpICYgIWlzLm5hKERhckxvbmdpdHVkZSkpCmxvY0FscGluby5kYXRhIDwtIEFscGluby5kYXRhIFssIGMoJ0RhckxvbmdpdHVkZScsICdEYXJMYXRpdHVkZScpXQoKQm9tYmlhcy5kYXRhIDwtIHN1YnNldChCb21iaWFzLmRhdGEsICFpcy5uYShEYXJMYXRpdHVkZSkgJiAhaXMubmEoRGFyTG9uZ2l0dWRlKSkKbG9jQm9tYmlhcy5kYXRhIDwtIEJvbWJpYXMuZGF0YSBbLCBjKCdEYXJMb25naXR1ZGUnLCAnRGFyTGF0aXR1ZGUnKV0KCgpCb21idXNTdWIuZGF0YSA8LSBzdWJzZXQoQm9tYnVzU3ViLmRhdGEsICFpcy5uYShEYXJMYXRpdHVkZSkgJiAhaXMubmEoRGFyTG9uZ2l0dWRlKSkKbG9jQm9tYnVzLmRhdGEgPC0gQm9tYnVzU3ViLmRhdGEgWywgYygnRGFyTG9uZ2l0dWRlJywgJ0RhckxhdGl0dWRlJyldCgoKQnJhY2h5LmRhdGEgPC0gc3Vic2V0KEJyYWNoeS5kYXRhLCAhaXMubmEoRGFyTGF0aXR1ZGUpICYgIWlzLm5hKERhckxvbmdpdHVkZSkpCmxvY0JyYWNoeS5kYXRhIDwtIEJyYWNoeS5kYXRhIFssIGMoJ0RhckxvbmdpdHVkZScsICdEYXJMYXRpdHVkZScpXQoKI3NraXBwZWQgQ29jY2luZW8KCkNvbGx1bS5kYXRhIDwtIHN1YnNldChDb2xsdW1hbm8uZGF0YSwgIWlzLm5hKERhckxhdGl0dWRlKSAmICFpcy5uYShEYXJMb25naXR1ZGUpKQpsb2NDb2xsdW0uZGF0YSA8LSBDb2xsdW0uZGF0YSBbLCBjKCdEYXJMb25naXR1ZGUnLCAnRGFyTGF0aXR1ZGUnKV0KClRob3JhY28uZGF0YSA8LSBzdWJzZXQoVGhvcmFjby5kYXRhLCAhaXMubmEoRGFyTGF0aXR1ZGUpICYgIWlzLm5hKERhckxvbmdpdHVkZSkpCmxvY1Rob3JhY28uZGF0YSA8LSBUaG9yYWNvLmRhdGEgWywgYygnRGFyTG9uZ2l0dWRlJywgJ0RhckxhdGl0dWRlJyldCmBgYApgYGB7cn0KcGxvdCh3cmxkX3NpbXBsLAogICAgIHhsaW0gPSBjKG1pbi5sb24sIG1heC5sb24pLAogICAgIHlsaW0gPSBjKG1pbi5sYXQsIG1heC5sYXQpLAogICAgIGF4ZXMgPSBUUlVFLAogICAgIGNvbCA9ICJncmV5OTUiKQoKcGxvdCh3cmxkX3NpbXBsLCBhZGQgPSBUUlVFLCBib3JkZXIgPSAiZ3JleTUiKQoKI3BvaW50cyh4ID0gY2xlYW4uZGF0YSREYXJEZWNpbWFsTG9uZ2l0dWRlLAogIyAgICAgIHkgPSBjbGVhbi5kYXRhJERhckRlY2ltYWxMYXRpdHVkZSwKICAjICAgICBjb2wgPSAnb2xpdmVkcmFiJywKICAgIyAgICBwY2ggPSAyMCwKICAgICMgICBjZXggPSAwLjc1KQoKcG9pbnRzKHggPSBsb2NweXJvLmRhdGEkRGFyRGVjaW1hbExvbmdpdHVkZSwKICAgICAgIHkgPSBsb2NweXJvLmRhdGEkRGFyRGVjaW1hbExhdGl0dWRlLAogICAgICAgY29sID0gJ3JlZCcsCiAgICAgICBwY2ggPSAyMCwKICAgICAgIGNleCA9IDAuNzUpCgpwb2ludHMoeCA9IGxvY0FscGlnZW4uZGF0YSREYXJMb25naXR1ZGUsCiAgICAgICB5ID0gbG9jQWxwaWdlbi5kYXRhJERhckxhdGl0dWRlLAogICAgICAgY29sID0gJ3llbGxvdycsCiAgICAgICBwY2ggPSAyMCwKICAgICAgIGNleCA9IDAuNzUpCgpwb2ludHMoeCA9IGxvY0Fncm8uZGF0YSREYXJMb25naXR1ZGUsCiAgICAgICB5ID0gbG9jQWdyby5kYXRhJERhckxhdGl0dWRlLAogICAgICAgY29sID0gJ3BpbmsnLAogICAgICAgcGNoID0gMjAsCiAgICAgICBjZXggPSAwLjc1KQogCnBvaW50cyh4ID0gbG9jQWxwaW5vLmRhdGEkRGFyTG9uZ2l0dWRlLAogICAgICAgeSA9IGxvY0FscGluby5kYXRhJERhckxhdGl0dWRlLAogICAgICAgY29sID0gJ2JsdWUnLAogICAgICAgcGNoID0gMjAsCiAgICAgICBjZXggPSAwLjc1KQoKCnBvaW50cyh4ID0gbG9jQm9tYmlhcy5kYXRhJERhckxvbmdpdHVkZSwKICAgICAgIHkgPSBsb2NCb21iaWFzLmRhdGEkRGFyTGF0aXR1ZGUsCiAgICAgICBjb2wgPSAncHVycGxlJywKICAgICAgIHBjaCA9IDIwLAogICAgICAgY2V4ID0gMC43NSkKCnBvaW50cyh4ID0gbG9jQm9tYnVzLmRhdGEkRGFyTG9uZ2l0dWRlLAogICAgICAgeSA9IGxvY0JvbWJ1cy5kYXRhJERhckxhdGl0dWRlLAogICAgICAgY29sID0gJ2dyZXknLAogICAgICAgcGNoID0gMjAsCiAgICAgICBjZXggPSAwLjc1KQoKcG9pbnRzKHggPSBsb2NCcmFjaHkuZGF0YSREYXJMb25naXR1ZGUsCiAgICAgICB5ID0gbG9jQnJhY2h5LmRhdGEkRGFyTGF0aXR1ZGUsCiAgICAgICBjb2wgPSAnb2xpdmVkcmFiJywKICAgICAgIHBjaCA9IDIwLAogICAgICAgY2V4ID0gMC43NSkKCnBvaW50cyh4ID0gbG9jQ29sbHVtLmRhdGEkRGFyTG9uZ2l0dWRlLAogICAgICAgeSA9IGxvY0NvbGx1bS5kYXRhJERhckxhdGl0dWRlLAogICAgICAgY29sID0gJ2JsYWNrJywKICAgICAgIHBjaCA9IDIwLAogICAgICAgY2V4ID0gMC43NSkKCnBvaW50cyh4ID0gbG9jVGhvcmFjby5kYXRhJERhckxvbmdpdHVkZSwKICAgICAgIHkgPSBsb2NUaG9yYWNvLmRhdGEkRGFyTGF0aXR1ZGUsCiAgICAgICBjb2wgPSAnZ3JlZW4nLAogICAgICAgcGNoID0gMjAsCiAgICAgICBjZXggPSAwLjc1KQpgYGAKYGBge3J9CnBsb3Qod3JsZF9zaW1wbCwKICAgICB4bGltID0gYygtMTcwLCAtMzkpLAogICAgIHlsaW0gPSBjKDExLCA3MiksCiAgICAgYXhlcyA9IFRSVUUsCiAgICAgY29sID0gImdyZXk5NSIpCnBvaW50cyh4ID0gbG9jcHlyby5kYXRhJERhckRlY2ltYWxMb25naXR1ZGUsCiAgICAgICB5ID0gbG9jcHlyby5kYXRhJERhckRlY2ltYWxMYXRpdHVkZSwKICAgICAgIGNvbCA9ICdyZWQnLAogICAgICAgcGNoID0gMjAsCiAgICAgICBjZXggPSAwLjc1KQoKcG9pbnRzKHggPSBsb2NCb21idXMuZGF0YSREYXJMb25naXR1ZGUsCiAgICAgICB5ID0gbG9jQm9tYnVzLmRhdGEkRGFyTGF0aXR1ZGUsCiAgICAgICBjb2wgPSAnZ3JleScsCiAgICAgICBwY2ggPSAyMCwKICAgICAgIGNleCA9IDAuNzUpCnBvaW50cyh4ID0gbG9jQ29sbHVtLmRhdGEkRGFyTG9uZ2l0dWRlLAogICAgICAgeSA9IGxvY0NvbGx1bS5kYXRhJERhckxhdGl0dWRlLAogICAgICAgY29sID0gJ2JsYWNrJywKICAgICAgIHBjaCA9IDIwLAogICAgICAgY2V4ID0gMC43NSkKCnBvaW50cyh4ID0gbG9jVGhvcmFjby5kYXRhJERhckxvbmdpdHVkZSwKICAgICAgIHkgPSBsb2NUaG9yYWNvLmRhdGEkRGFyTGF0aXR1ZGUsCiAgICAgICBjb2wgPSAnZ3JlZW4nLAogICAgICAgcGNoID0gMjAsCiAgICAgICBjZXggPSAwLjc1KSAKYGBgCgpBZGQgYSBuZXcgY2h1bmsgYnkgY2xpY2tpbmcgdGhlICpJbnNlcnQgQ2h1bmsqIGJ1dHRvbiBvbiB0aGUgdG9vbGJhciBvciBieSBwcmVzc2luZyAqQ21kK09wdGlvbitJKi4KCldoZW4geW91IHNhdmUgdGhlIG5vdGVib29rLCBhbiBIVE1MIGZpbGUgY29udGFpbmluZyB0aGUgY29kZSBhbmQgb3V0cHV0IHdpbGwgYmUgc2F2ZWQgYWxvbmdzaWRlIGl0IChjbGljayB0aGUgKlByZXZpZXcqIGJ1dHRvbiBvciBwcmVzcyAqQ21kK1NoaWZ0K0sqIHRvIHByZXZpZXcgdGhlIEhUTUwgZmlsZSkuIAoKVGhlIHByZXZpZXcgc2hvd3MgeW91IGEgcmVuZGVyZWQgSFRNTCBjb3B5IG9mIHRoZSBjb250ZW50cyBvZiB0aGUgZWRpdG9yLiBDb25zZXF1ZW50bHksIHVubGlrZSAqS25pdCosICpQcmV2aWV3KiBkb2VzIG5vdCBydW4gYW55IFIgY29kZSBjaHVua3MuIEluc3RlYWQsIHRoZSBvdXRwdXQgb2YgdGhlIGNodW5rIHdoZW4gaXQgd2FzIGxhc3QgcnVuIGluIHRoZSBlZGl0b3IgaXMgZGlzcGxheWVkLgoK